home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1997-10-26 | 12.7 KB | 375 lines |
- (*----------------------------------------------------------------------*
- * *
- * MAGICTOOLS Modula's All purpose GEM Interface Cadre Toolbox *
- * ÿ ÿ ÿ ÿ ÿ *
- *----------------------------------------------------------------------*
- * Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
- *----------------------------------------------------------------------*
- * Dieses Modul ist urheberrechtlich geschtzt. *
- * *
- * Die Verffentlichung des Quelltextes oder Teilen daraus, sowie die *
- * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
- * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail- *
- * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen *
- * Einverstndnisserklrung des Autors. *
- * *
- * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist *
- * fr Lizenznehmer ausdrcklich erlaubt! Der Autor behlt sich das *
- * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
- * widerrufen. *
- *----------------------------------------------------------------------*)
-
- IMPLEMENTATION MODULE mtArea;
-
- (*----------------------------------------------------------------------*
- * Int. Vers | Datum | Name | nderung *
- *-----------+----------+------+----------------------------------------*
- * 3.00 | 18.01.92 | Hp | *
- * 3.01 | 02.02.92 | Hp | MoveDial gendert. Dadurch sparen sich *
- * | | | die Module mtDials und mtPopups eine *
- * | | | Menge Rechnerei... *
- * | | | Routinen allgemein optimiert *
- *-----------+----------+------+----------------------------------------*)
-
-
-
- (* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
- (* *)
- (*$R- Range-Checks *)
- (*$S- Stack-Check *)
- (* *)
- (*----------------------------------------------*)
-
-
-
-
-
-
-
-
- FROM Storage IMPORT ALLOCATE, DEALLOCATE;
-
-
-
-
- FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
- Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
- Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
- sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
- CastToChar, CastToByte, CastToByteset, CastToInt,
- CastToCard, CastToBitset, CastToWord, CastToLInt,
- CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
- TosVersion, Accessory, Basepage, SysHeader, TosDate;
-
-
-
-
-
-
- FROM SYSTEM IMPORT ADDRESS, ADR, WORD, BYTE, TSIZE;
- FROM MagicVDI IMPORT VDIIntIn, VDIIntOut, VDIPtsIn, VDIPtsOut, VDIControl,
- VDICall, tWorkIn, tWorkOut, MFDB;
- FROM mtUtils IMPORT tRect, AbsRect;
- FROM mtAppl IMPORT Bitplanes, MouseOn, MouseOff, DeskX, DeskY,
- MaxWidth, MaxHeight;
- IMPORT MagicAES, MagicVDI;
-
-
- TYPE AREA = POINTER TO Area;
- Area = RECORD
- x: sINTEGER;
- y: sINTEGER;
- w: sINTEGER;
- h: sINTEGER;
- init: BOOLEAN;
- size: lCARDINAL;
- mfdbadr: ADDRESS;
- mfdb: MFDB;
- END;
-
- VAR control7: POINTER TO ADDRESS; (* it's tricky... *)
- control9: POINTER TO ADDRESS;
- r: POINTER TO tRect;
-
- VAR ScreenMFDB: MFDB; (* MFDB fr Bildschirm *)
- ScreenPtr: ADDRESS;
- Screen: tRect; (* Ausmae des gesamten Schirms *)
-
- PROCEDURE NewAREA (VAR a: AREA): BOOLEAN;
- BEGIN
- ALLOCATE (a, TSIZE (Area));
- IF a = NIL THEN RETURN FALSE; END;
- a^.x:= -1;
- a^.y:= -1;
- a^.w:= -1;
- a^.h:= -1;
- a^.init:= FALSE;
- a^.size:= 0FFFFFFFFH;
- a^.mfdb.fdAddr:= NIL;
- a^.mfdbadr:= ADR (a^.mfdb);
- RETURN TRUE;
- END NewAREA;
-
- PROCEDURE DisposeAREA (VAR a: AREA);
- BEGIN
- IF a = NIL THEN RETURN; END;
- DEALLOCATE (a^.mfdb.fdAddr, 0);
- DEALLOCATE (a, 0);
- a:= NIL;
- END DisposeAREA;
-
- PROCEDURE FreeArea (a: AREA);
- BEGIN
- IF a = NIL THEN RETURN; END;
- DEALLOCATE (a^.mfdb.fdAddr, 0);
- a^.x:= -1; a^.y:= -1; a^.w:= -1; a^.h:= -1;
- a^.init:= FALSE;
- a^.size:= 0FFFFFFFFH;
- a^.mfdb.fdAddr:= NIL;
- END FreeArea;
-
- PROCEDURE SaveArea (hndl: sINTEGER; a: AREA; rect: ARRAY OF LOC): BOOLEAN;
- VAR b,c,d,e: sINTEGER;
- BEGIN
- IF a = NIL THEN RETURN FALSE; END;
- r:= ADR (rect);
- b:= r^.x; c:= r^.y; d:= r^.w; e:= r^.h;
- WITH a^ DO
- IF init AND ((d > w) OR (e > h)) THEN
- DEALLOCATE (mfdb.fdAddr, 0); init:= FALSE;
- END;
- IF NOT init THEN
- mfdb.fdWdwidth:= (d + 15) DIV 16;
- mfdb.fdW:= mfdb.fdWdwidth * 16;
- mfdb.fdH:= e + 1;
- mfdb.fdStand:= 0;
- mfdb.fdNplanes:= Bitplanes;
- size:= LONG (mfdb.fdWdwidth) * LONG (mfdb.fdH) * LONG (Bitplanes) * LONG (2);
- ALLOCATE (mfdb.fdAddr, size);
- IF mfdb.fdAddr = NIL THEN RETURN FALSE; END;
- init:= TRUE;
- END;
- x:= b; y:= c; w:= d; h:= e;
- MouseOff;
- VDIIntIn[0]:= 3;
- VDIPtsIn[0]:= x;
- VDIPtsIn[1]:= y;
- VDIPtsIn[2]:= x + w - 1;
- VDIPtsIn[3]:= y + h - 1;
- VDIPtsIn[4]:= 0;
- VDIPtsIn[5]:= 0;
- VDIPtsIn[6]:= w - 1;
- VDIPtsIn[7]:= h - 1;
- control7^:= ScreenPtr;
- control9^:= mfdbadr;
- VDICall (109, 4, 1, 0, hndl);
- MouseOn;
- END;
- RETURN TRUE;
- END SaveArea;
-
- PROCEDURE RestoreArea (hndl: sINTEGER; a: AREA);
- BEGIN
- IF a = NIL THEN RETURN; END;
- WITH a^ DO
- IF init THEN
- MouseOff;
- VDIIntIn[0]:= 3;
- VDIPtsIn[0]:= 0;
- VDIPtsIn[1]:= 0;
- VDIPtsIn[2]:= w - 1;
- VDIPtsIn[3]:= h - 1;
- VDIPtsIn[4]:= x;
- VDIPtsIn[5]:= y;
- VDIPtsIn[6]:= x + VDIPtsIn[2];
- VDIPtsIn[7]:= y + VDIPtsIn[3];
- control7^:= mfdbadr;
- control9^:= ScreenPtr;
- VDICall (109, 4, 1, 0, hndl);
- MouseOn;
- END;
- END;
- END RestoreArea;
-
- PROCEDURE CopyArea (hndl: sINTEGER; a: AREA; xx, yy: sINTEGER);
- BEGIN
- IF a = NIL THEN RETURN; END;
- WITH a^ DO
- IF init THEN
- MouseOff;
- VDIIntIn[0]:= 3;
- VDIPtsIn[0]:= 0;
- VDIPtsIn[1]:= 0;
- VDIPtsIn[2]:= w - 1;
- VDIPtsIn[3]:= h - 1;
- VDIPtsIn[4]:= xx;
- VDIPtsIn[5]:= yy;
- VDIPtsIn[6]:= xx + VDIPtsIn[2];
- VDIPtsIn[7]:= yy + VDIPtsIn[3];
- control7^:= mfdbadr;
- control9^:= ScreenPtr;
- VDICall (109, 4, 1, 0, hndl);
- MouseOn;
- END;
- END;
- END CopyArea;
-
- PROCEDURE MoveArea (hndl: sINTEGER; a: AREA; xm, ym: sINTEGER; VAR xx, yy: sINTEGER);
- CONST fly = 3;
- VAR (*$Reg*) p: sINTEGER;
- (*$Reg*) mx: sINTEGER;
- (*$Reg*) my: sINTEGER;
- (*$Reg*) w1: sINTEGER;
- (*$Reg*) h1: sINTEGER;
- BEGIN
- IF a = NIL THEN RETURN END;
- IF a^.init THEN
- WITH a^ DO
- MouseOff;
- VDIIntIn[0]:= 3;
- mx:= x + w; my:= y + h; w1:= w - 1; h1:= h - 1;
-
- IF ym < 0 THEN (* Nach oben *)
- p:= ABS (ym); IF p >= (h DIV fly) THEN p:= h DIV fly; END;
- IF (y - p) < Screen.y THEN p:= y - Screen.y; END;
- IF p > 0 THEN
- (* Bildschirm teilrestaurieren *)
- VDIPtsIn[0]:= 0; VDIPtsIn[1]:= h - p;
- VDIPtsIn[2]:= w1; VDIPtsIn[3]:= h1;
- VDIPtsIn[4]:= x; VDIPtsIn[5]:= my - p;
- VDIPtsIn[6]:= mx - 1; VDIPtsIn[7]:= my - 1;
- control7^:= mfdbadr; control9^:= ScreenPtr;
- VDICall (109, 4, 1, 0, hndl);
- (* Rest intern verschieben *)
- VDIPtsIn[0]:= 0; VDIPtsIn[1]:= 0;
- VDIPtsIn[2]:= w1; VDIPtsIn[3]:= h - p;
- VDIPtsIn[4]:= 0; VDIPtsIn[5]:= p;
- VDIPtsIn[6]:= w1; VDIPtsIn[7]:= h;
- control7^:= mfdbadr; control9^:= mfdbadr;
- VDICall (109, 4, 1, 0, hndl);
- (* Bildschirm neuen Teil sichern *)
- VDIPtsIn[0]:= x; VDIPtsIn[1]:= y - p;
- VDIPtsIn[2]:= mx - 1; VDIPtsIn[3]:= y - 1;
- VDIPtsIn[4]:= 0; VDIPtsIn[5]:= 0;
- VDIPtsIn[6]:= w1; VDIPtsIn[7]:= p - 1; (* - 1 added by DS *)
- control7^:= ScreenPtr; control9^:= mfdbadr;
- VDICall (109, 4, 1, 0, hndl);
- DEC (y, p); my:= y + h;
- END;
-
- ELSIF ym > 0 THEN (* Nach unten *)
- p:= ym; IF p >= (h DIV fly) THEN p:= h DIV fly; END;
- IF (my + p) > Screen.h THEN p:= Screen.h - my; END;
- IF p > 0 THEN
- (* Bildschirm teilrestaurieren *)
- VDIPtsIn[0]:= 0; VDIPtsIn[1]:= 0;
- VDIPtsIn[2]:= w1; VDIPtsIn[3]:= p - 1;
- VDIPtsIn[4]:= x; VDIPtsIn[5]:= y;
- VDIPtsIn[6]:= mx - 1; VDIPtsIn[7]:= y + p - 1;
- control7^:= mfdbadr; control9^:= ScreenPtr;
- VDICall (109, 4, 1, 0, hndl);
- (* Rest intern verschieben *)
- VDIPtsIn[0]:= 0; VDIPtsIn[1]:= p;
- VDIPtsIn[2]:= w1; VDIPtsIn[3]:= h;
- VDIPtsIn[4]:= 0; VDIPtsIn[5]:= 0;
- VDIPtsIn[6]:= w1; VDIPtsIn[7]:= h - p;
- control7^:= mfdbadr; control9^:= mfdbadr;
- VDICall (109, 4, 1, 0, hndl);
- (* Bildschirm neuen Teil sichern *)
- VDIPtsIn[0]:= x; VDIPtsIn[1]:= my;
- VDIPtsIn[2]:= mx - 1; VDIPtsIn[3]:= my + p - 1;
- VDIPtsIn[4]:= 0; VDIPtsIn[5]:= h - p;
- VDIPtsIn[6]:= w1; VDIPtsIn[7]:= h1;
- control7^:= ScreenPtr; control9^:= mfdbadr;
- VDICall (109, 4, 1, 0, hndl);
- INC (y, p); my:= y + h;
- END;
- END;
-
- IF xm < 0 THEN (* Nach Links *)
- p:= ABS (xm);
- IF p >= (w DIV fly) THEN p:= w DIV fly; END;
- IF (x - p) < 0 THEN p:= x - 1; END;
- IF NOT ODD (p) THEN DEC (p); END;
- IF p > 0 THEN
- (* Bildschirm teilrestaurieren *)
- VDIPtsIn[0]:= w - p; VDIPtsIn[1]:= 0;
- VDIPtsIn[2]:= w1; VDIPtsIn[3]:= h1;
- VDIPtsIn[4]:= mx - p; VDIPtsIn[5]:= y;
- VDIPtsIn[6]:= mx - 1; VDIPtsIn[7]:= my - 1;
- control7^:= mfdbadr; control9^:= ScreenPtr;
- VDICall (109, 4, 1, 0, hndl);
- (* Rest intern verschieben *)
- VDIPtsIn[0]:= 0; VDIPtsIn[1]:= 0;
- VDIPtsIn[2]:= w1 - p; VDIPtsIn[3]:= h1;
- VDIPtsIn[4]:= p; VDIPtsIn[5]:= 0;
- VDIPtsIn[6]:= w1; VDIPtsIn[7]:= h1;
- control7^:= mfdbadr; control9^:= mfdbadr;
- VDICall (109, 4, 1, 0, hndl);
- (* Bildschirm neuen Teil sichern *)
- VDIPtsIn[0]:= x - p; VDIPtsIn[1]:= y;
- VDIPtsIn[2]:= x - 1; VDIPtsIn[3]:= my - 1;
- VDIPtsIn[4]:= 0; VDIPtsIn[5]:= 0;
- VDIPtsIn[6]:= p - 1; VDIPtsIn[7]:= h1;
- control7^:= ScreenPtr; control9^:= mfdbadr;
- VDICall (109, 4, 1, 0, hndl);
- DEC (x, p); mx:= x + w;
- END;
-
- ELSIF xm > 0 THEN (* Nach Rechts *)
- p:= xm; IF p >= (w DIV fly) THEN p:= w DIV fly; END;
- IF (mx + p) > Screen.w THEN p:= Screen.w - mx; END;
- IF NOT ODD (p) THEN DEC (p); END;
- IF p > 0 THEN
- (* Bildschirm teilrestaurieren *)
- VDIPtsIn[0]:= 0; VDIPtsIn[1]:= 0;
- VDIPtsIn[2]:= p - 1; VDIPtsIn[3]:= h1;
- VDIPtsIn[4]:= x; VDIPtsIn[5]:= y;
- VDIPtsIn[6]:= x + p - 1; VDIPtsIn[7]:= my - 1;
- control7^:= mfdbadr; control9^:= ScreenPtr;
- VDICall (109, 4, 1, 0, hndl);
- (* Rest intern verschieben *)
- VDIPtsIn[0]:= p; VDIPtsIn[1]:= 0;
- VDIPtsIn[2]:= w1; VDIPtsIn[3]:= h1;
- VDIPtsIn[4]:= 0; VDIPtsIn[5]:= 0;
- VDIPtsIn[6]:= w1 - p; VDIPtsIn[7]:= h1;
- control7^:= mfdbadr; control9^:= mfdbadr;
- VDICall (109, 4, 1, 0, hndl);
- (* Bildschirm neuen Teil sichern *)
- VDIPtsIn[0]:= mx; VDIPtsIn[1]:= y;
- VDIPtsIn[2]:= mx + p - 1; VDIPtsIn[3]:= my - 1;
- VDIPtsIn[4]:= w - p; VDIPtsIn[5]:= 0;
- VDIPtsIn[6]:= w1; VDIPtsIn[7]:= h1;
- control7^:= ScreenPtr; control9^:= mfdbadr;
- VDICall (109, 4, 1, 0, hndl);
- INC (x, p); mx:= x + w;
- END;
- END;
- END;
- MouseOn;
- xx:= a^.x;
- yy:= a^.y;
- END;
- END MoveArea;
-
- VAR init: sCARDINAL;
-
- PROCEDURE InitMtArea;
- BEGIN
- IF init # 30961 THEN
- Screen.x:= DeskX; Screen.y:= DeskY;
- Screen.w:= MaxWidth; Screen.h:= MaxHeight;
- ScreenMFDB.fdAddr:= Null;
- ScreenPtr:= ADR (ScreenMFDB);
- control7:= ADR (VDIControl[7]);
- control9:= ADR (VDIControl[9]);
- init:= 30961;
- END;
- END InitMtArea;
-
- BEGIN
- init:= 0;
- InitMtArea;
- END mtArea.
-
-